"""
Обшие дополнительные вспомогательные функции, для работы плагинов.

- Прсер временнйо метки.
- Функция для очистки текста от мусора.
- Резделение чисел по разряду.
- Генератор числового кода.
- Конвентер систем счисления.

Author: Milinuri Nirvalen
Ver: 1.4 (8)
"""

from random import randrange
import re


# Парсер дельты времени
# =====================

TIME_PATTERN = re.compile(r"(?P<value>\d{1,2})\s?(?P<modifier>[wdh]|mi|mo|[ндч]|ми|ме)")
TIME_MODIFIERS = {
	"mo": 3600*24*30,
	"ме": 3600*24*30,

	"w": 3600*24*7,
	"н": 3600*24*7,

	"d": 3600 * 24,
	"д": 3600 * 24,

	"h": 3600,
	"ч": 3600,

	"mi": 60,
	"ми": 60,
}

def parse_timedelta(args: str) -> int:
	res = 0

	for x in TIME_PATTERN.finditer(args):
		value, modifier = x.groups()
		res += int(value) * TIME_MODIFIERS[modifier]

	return res


# Прочие вспомогательные функции
# ==============================

def clear_text(raw_text: str) -> str:
	"""Очищает текст.

	Нижний регистр без повтора символов.
	Полезно для неточного сравнения."""

	text = ""
	ls = None

	for x in raw_text.lower():
		if x != ls:
			text += x
			ls = x

	return text

def sp(x: str | int) -> str:
	"""Разделяет число по разрядам."""
	return f'{int(x) if isinstance(x, str) else x:,}'.replace(',', '.')

def gen_code(lenght: int) -> int:
	"""генерирует числовой код заданной длинны.

	Args:
		lenght (int): Длинна кодовой строки

	Returns:
		int: Кодовое число.
	"""

	code = 0
	for x in range(lenght+1):
		code += randrange(9) * (10 ** x)

	return code

# TODO: Переработать функицю для многих систем счисления
def binToNum(num: str) -> int:
	"""Переводит двоичное число в десятичное."""
	res = 0
	for i, x in enumerate(num[::-1]):
		if not x.isdigit():
			continue

		res += int(x)*2**i
	return res
